From 3f56c530b3b5c77f2b9194c479afd1cdd25e9a42 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 8 Jan 2016 13:17:58 -0500 Subject: [PATCH] Be more careful with floating point divisions The assumption that MIN() takes care of all infinities here turns out to be wrong. We were getting inf and -nan for some combinations of 0 width/height and corners, leading to invalid matrices and cairo errors. https://bugzilla.gnome.org/show_bug.cgi?id=759668 --- gtk/gtkroundedbox.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/gtk/gtkroundedbox.c b/gtk/gtkroundedbox.c index 3d2befe658..b63b7d51e5 100644 --- a/gtk/gtkroundedbox.c +++ b/gtk/gtkroundedbox.c @@ -56,16 +56,23 @@ static void gtk_rounded_box_clamp_border_radius (GtkRoundedBox *box) { gdouble factor = 1.0; + gdouble corners; - /* note: division by zero leads to +INF, which is > factor, so will be ignored */ - factor = MIN (factor, box->box.width / (box->corner[GTK_CSS_TOP_LEFT].horizontal + - box->corner[GTK_CSS_TOP_RIGHT].horizontal)); - factor = MIN (factor, box->box.height / (box->corner[GTK_CSS_TOP_RIGHT].vertical + - box->corner[GTK_CSS_BOTTOM_RIGHT].vertical)); - factor = MIN (factor, box->box.width / (box->corner[GTK_CSS_BOTTOM_RIGHT].horizontal + - box->corner[GTK_CSS_BOTTOM_LEFT].horizontal)); - factor = MIN (factor, box->box.height / (box->corner[GTK_CSS_TOP_LEFT].vertical + - box->corner[GTK_CSS_BOTTOM_LEFT].vertical)); + corners = box->corner[GTK_CSS_TOP_LEFT].horizontal + box->corner[GTK_CSS_TOP_RIGHT].horizontal; + if (corners != 0) + factor = MIN (factor, box->box.width / corners); + + corners = box->corner[GTK_CSS_TOP_RIGHT].vertical + box->corner[GTK_CSS_BOTTOM_RIGHT].vertical; + if (corners != 0) + factor = MIN (factor, box->box.height / corners); + + corners = box->corner[GTK_CSS_BOTTOM_RIGHT].horizontal + box->corner[GTK_CSS_BOTTOM_LEFT].horizontal; + if (corners != 0) + factor = MIN (factor, box->box.width / corners); + + corners = box->corner[GTK_CSS_TOP_LEFT].vertical + box->corner[GTK_CSS_BOTTOM_LEFT].vertical; + if (corners != 0) + factor = MIN (factor, box->box.height / corners); box->corner[GTK_CSS_TOP_LEFT].horizontal *= factor; box->corner[GTK_CSS_TOP_LEFT].vertical *= factor; -- 2.30.2